package com.xinggq.common.config;

import com.xinggq.common.utils.IdGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ID生成器自动配置类
 * 
 * <p>提供Spring Boot自动配置支持，可以通过配置文件配置ID生成器参数</p>
 * 
 * <p><strong>重要提醒：</strong></p>
 * <ul>
 *   <li>在分布式环境中，确保每个节点的 workerId 和 datacenterId 组合唯一</li>
 *   <li>workerId 和 datacenterId 的取值范围都是 0-31</li>
 *   <li>配置冲突可能导致生成重复的ID，请谨慎配置</li>
 * </ul>
 * 
 * @author xinggq
 * @since 1.0.0
 */
@Configuration
@EnableConfigurationProperties(IdGeneratorProperties.class)
@ConditionalOnProperty(prefix = "id-generator", name = "enabled", havingValue = "true", matchIfMissing = true)
public class IdGeneratorConfig {
    
    private static final Logger log = LoggerFactory.getLogger(IdGeneratorConfig.class);
    
    /**
     * 创建ID生成器Bean
     * 
     * <p>在创建ID生成器时会进行配置验证和警告提示</p>
     * 
     * @param properties 配置属性
     * @return IdGenerator实例
     */
    @Bean
    public IdGenerator idGenerator(IdGeneratorProperties properties) {
        // 配置验证和警告日志
        validateAndLogConfiguration(properties);
        
        return new IdGenerator(properties.workerId(), properties.datacenterId());
    }
    
    /**
     * 验证配置并输出警告日志
     * 
     * @param properties 配置属性
     */
    private void validateAndLogConfiguration(IdGeneratorProperties properties) {
        long workerId = properties.workerId();
        long datacenterId = properties.datacenterId();
        
        // 记录当前配置
        log.info("ID生成器配置 - WorkerId: {}, DatacenterId: {}", workerId, datacenterId);
        
        // 检查是否使用默认配置
        if (workerId == 1L && datacenterId == 1L) {
            log.warn("⚠️  ID生成器使用默认配置 (WorkerId=1, DatacenterId=1)");
            log.warn("⚠️  在生产环境或分布式部署中，请为每个节点配置唯一的 WorkerId 和 DatacenterId 组合");
            log.warn("⚠️  配置示例：");
            log.warn("⚠️    节点1: worker-id=1, datacenter-id=1");
            log.warn("⚠️    节点2: worker-id=2, datacenter-id=1");
            log.warn("⚠️    节点3: worker-id=1, datacenter-id=2");
        }
        
        // 验证取值范围
        if (workerId < 0 || workerId > 31) {
            log.error("❌ WorkerId 配置错误: {}，有效范围是 0-31", workerId);
        }
        
        if (datacenterId < 0 || datacenterId > 31) {
            log.error("❌ DatacenterId 配置错误: {}，有效范围是 0-31", datacenterId);
        }
        
        // 提醒配置的重要性
        log.info("💡 配置提醒：");
        log.info("💡   - 确保在同一集群中，每个节点的 (WorkerId, DatacenterId) 组合唯一");
        log.info("💡   - WorkerId 用于区分同一数据中心内的不同机器");
        log.info("💡   - DatacenterId 用于区分不同的数据中心或可用区");
        log.info("💡   - 配置冲突可能导致生成重复的ID，影响业务数据唯一性");
    }
}